/*
** $ 身份：嘞虚拟机器.h $
** 炉啊虚拟机器
** 请参见 炉啊.h中的版权声明
*/

#ifndef 嘞虚拟机器_喝
#define 嘞虚拟机器_喝


#include "嘞做.h"
#include "嘞对象.h"
#include "嘞标签方法.h"

#if !defined(炉啊_不转换嚏号码到串)
#define 转换嚏到串(欧)	嚏嚏是否号码(欧)
#else
#define 转换嚏到串(欧)	0	/* 不从数字到串的转换 */
#endif

#if !defined(炉啊_不转换嚏串到号码)
#define 转换嚏到号码(欧)	嚏嚏是否串(欧)
#else
#define 转换嚏到号码(欧)	0	/* 不从串到数字的转换 */
#endif

/*
** 如果要将浮点数转换为整数, 则可以定义 炉啊_向下取整号码到整数
** 通过对它们进行向下取整 (如果它们不是整数值, 则不会引发错误) 
*/
#if !defined(炉啊_向下取整号码到整数)
#define 炉啊_向下取整号码到整数		浮点到整数等于
#endif

/*
** 浮点型->整数强制的舍入模式
*/
typedef enum {
  浮点到整数等于,     /* 不四舍五入; 仅接受整数值 */
  浮点到整数向下取整,  /* 拿向下取整的号码 */
  浮点到整数向正无穷取整    /* 拿向正无穷取整的号码 */
} 浮点到整数模;

/* 将对象转换为浮点数 (包括串强制) */
#define 到号码(欧,恩) \
	(嚏嚏是否浮点(欧) ? (*(恩) = 浮点值(欧), 1) : 炉啊微_到号码_(欧,恩))

/* 将对象转换为浮点数 (没有串强制) */
#define 到号码恩丝(欧,恩) \
	(嚏嚏是否浮点(欧) ? ((恩) = 浮点值(欧), 1) : \
	(嚏嚏是否整数(欧) ? ((恩) = 投_号码(整数值(欧)), 1) : 0))

/* 将对象转换为整数 (包括串强制) */
#define 到整数(欧,艾) \
  (嚏嚏是否整数(欧) ? (*(艾) = 整数值(欧), 1) : 炉啊微_到整数(欧,艾,炉啊_向下取整号码到整数))

/* 将对象转换为整数 (没有串强制) */
#define 到整数恩丝(欧,艾) \
  (嚏嚏是否整数(欧) ? (*(艾) = 整数值(欧), 1) : 炉啊微_到整数恩丝(欧,艾,炉啊_向下取整号码到整数))

#define 整型操作(操作,微1,微2) 嘞_投由到串(嘞_投串到由(微1) 操作 嘞_投串到由(微2))

#define 炉啊微_原始等于对象(嚏1,嚏2)		炉啊微_等于对象(NULL,嚏1,嚏2)

/*
**快速获取 '取表' 的方法: 如果 '嚏' 是一个表并且存在 '嚏[颗]' ,
**返回1 且  '槽' 指向  '嚏[颗]''  (最终结果的位置)  ,
**否则, 返回0 (表示将必须检查元方法)  ,
*其中 '槽' 指向空的 '嚏[颗]''  (如果  '嚏' 是表) 或 NULL (否则) , 
*  '弗' 是要使用的原始取函数.
*/

#define 炉啊微_快速取(嘞,嚏,颗,槽,弗) \
  (!嚏嚏是否表(嚏)  \
   ? (槽 = NULL, 0)  /* 不是一个表; '槽' 是 NULL 而结果是 0 */  \
   : (槽 = 弗(喝值(嚏), 颗),  /* 否则, 做原始访问 */  \
      !是否空(槽)))  /* 结果不是空的? */

/*
** 整数的 '炉啊微_快速取' 的特殊情况，
* 包括 '炉啊喝_取整型' 的快速情况。
*/

#define 炉啊微_快速取艾(嘞,嚏,颗,槽) \
  (!嚏嚏是否表(嚏)  \
   ? (槽 = NULL, 0)  /* 不是一个表; '槽' 是 NULL 而结果是 0 */  \
   : (槽 = (嘞_投串到由(颗) - 1u < 喝值(嚏)->啊极限) \
              ? &喝值(嚏)->数组[颗 - 1] : 炉啊喝_取整型(喝值(嚏), 颗), \
      !是否空(槽)))  /* 结果不是空的? */

/*
** 完成快速设置操作 (快速获取成功时) . 在这种情况下,
** '槽' 指向放置值的位置.
*/
#define 炉啊微_完成快速设置(嘞,嚏,槽,微) \
    { 设置对象到表(嘞, 投(嚏值 *,槽), 微); \
      炉啊西_障碍背后(嘞, 垃圾回收值(嚏), 微); }

炉啊艾_函 int 炉啊微_等于对象 (炉啊_国 *嘞, const 嚏值 *嚏1, const 嚏值 *嚏2);
炉啊艾_函 int 炉啊微_小于 (炉啊_国 *嘞, const 嚏值 *嘞, const 嚏值 *日);
炉啊艾_函 int 炉啊微_小等 (炉啊_国 *嘞, const 嚏值 *嘞, const 嚏值 *日);
炉啊艾_函 int 炉啊微_到号码_ (const 嚏值 *对象, 炉啊_号码 *恩);
炉啊艾_函 int 炉啊微_到整数 (const 嚏值 *对象, 炉啊_整数 *匹, 浮点到整数模 模式);
炉啊艾_函 int 炉啊微_到整数恩丝 (const 嚏值 *对象, 炉啊_整数 *匹,
                                浮点到整数模 模式);
炉啊艾_函 int 炉啊微_浮点到整数 (炉啊_号码 恩, 炉啊_整数 *匹, 浮点到整数模 模式);
炉啊艾_函 void 炉啊微_完成取 (炉啊_国 *嘞, const 嚏值 *嚏, 嚏值 *键,
                               丝嚏颗身份 值, const 嚏值 *槽);
炉啊艾_函 void 炉啊微_完成设置 (炉啊_国 *嘞, const 嚏值 *嚏, 嚏值 *键,
                               嚏值 *值, const 嚏值 *槽);
炉啊艾_函 void 炉啊微_完成操作 (炉啊_国 *嘞);
炉啊艾_函 void 炉啊微_执行 (炉啊_国 *嘞, 调用信息 *调信);
炉啊艾_函 void 炉啊微_连接 (炉啊_国 *嘞, int 总共);
炉啊艾_函 炉啊_整数 炉啊微_符号除 (炉啊_国 *嘞, 炉啊_整数 斯, 炉啊_整数 医);
炉啊艾_函 炉啊_整数 炉啊微_余数 (炉啊_国 *嘞, 炉啊_整数 斯, 炉啊_整数 医);
炉啊艾_函 炉啊_号码 炉啊微_余数弗 (炉啊_国 *嘞, 炉啊_号码 斯, 炉啊_号码 医);
炉啊艾_函 炉啊_整数 炉啊微_移位嘞 (炉啊_整数 斯, 炉啊_整数 医);
炉啊艾_函 void 炉啊微_对象长度 (炉啊_国 *嘞, 丝嚏颗身份 日啊, const 嚏值 *日哔);

#endif